package mymyoux.core
{
	
	/**
	 * Gère le remplacement dynamique d'une variable.
	 * @author Mymyoux
	 * @version 2.0
	 */
	public class MString
	{
		/**
		 * Contient la liste des variables de Lang contenues dans le texte à observer.
		 */
		protected var langs:Array
		/**
		 * Contient la liste des variables de SVar contenues dans le texte à observer.
		 */
		protected var vars:Array;
		/**
		 * @private
		 */
		 protected var _value:String;
		 /**
		 * @private
		 */
		 protected var _translatedValue:String;
		 /**
		 * Element dont on veut observer la propriété.
		 */
		 protected var element:IMString;
		 /**
		 * Crée un objet de type MString.
		 * @param element Element à observer.
		 */
		public function MString(element:IMString)
		{
			this.element=element;
			langs=new Array();
			vars=new Array();
		}
		/** Détermine la propriété de l'élément.
		 *	@param element Element.
		 * 	@return Renvoie la propriété ou _value par defaut.
		 */
		protected function getPropertie(element:*):String
		{
			var properties:Array=new Array("text","label","_value");
			for(var p:String in properties)
			{
				if(element.hasOwnProperty(properties[p]))
				{
					return properties[p];
				}
			}
			return "_value";
		}
		/**
		 * Appelée à chaque mise à jour du texte ou de variables.
		 * @param event Inutilise ici.
		 * Met à jour les tableaux <code>langs</code> et <code>vars</code>.
		 * Appel <code>element.onTextChange()</code>.
		 * @see mymyoux.core.IMString#onTextChange()
		 */
		protected function onChange(event:*=null):void
		{
			//on supprime l'ancienne surveillance
			for(var p:String in langs)
			{
				Lang.unwatch(langs[p],onChange);
			}
			for(p in vars)
			{
				SVar.unwatch(vars[p],onChange);
			}
			//_text=_value;
			
			var reg:RegExp=new RegExp("\\$\\(([^\\)]+)\\)","g");
			var tab:Array;
			while(tab=reg.exec(_value))
			{
				langs.push(tab[1]);
				Lang.watch(tab[1],onChange);
			}
			reg=new RegExp("\\%\\(([^\\)]+)\\)","g");
			while(tab=reg.exec(_value))
			{
				vars.push(tab[1]);
				SVar.watch(tab[1],onChange);
			}
			_translatedValue=langs.length>0?Lang.trad(_value):_value;
			_translatedValue=vars.length>0?SVar.replace(_translatedValue):_translatedValue;
			element.onTextChange(_translatedValue);
		}
		[Bindable]
		/**
		 * Texte non modifié contenant les clés.
		 */
		public function get value():String
		{
			return _value;
		}
		public function set value(value:String):void
		{	
			_value=value;
			onChange();
		}
		/**
		 * Texte modifié.
		 */
		public function get  translatedValue():String
		{
			return _translatedValue;
		}

	}
}